from django.shortcuts import render, redirect, get_object_or_404
from django.views.decorators.http import require_POST
from shop.models import Product
from .cart import Cart
from .forms import CartAddProductForm


# 仅允许POST请求的装饰器
@require_POST
def cart_add(request, product_id):
    # 获取当前请求的购物车实例
    cart = Cart(request)
    # 从数据库中获取指定ID的产品，如果不存在则返回404错误
    product = get_object_or_404(Product, id=product_id)
    # 使用POST数据初始化购物车添加产品表单
    form = CartAddProductForm(request.POST)
    # 验证表单数据是否有效
    if form.is_valid():
        # 获取表单的清洗数据
        cd = form.cleaned_data
        # 将产品添加到购物车，同时更新数量
        cart.add(product=product,
                 quantity=cd['quantity'],
                 update_quantity=cd['update'])
    # 重定向到购物车详情页面
    return redirect('cart:cart_detail')


def cart_remove(request, product_id):
    # 获取当前请求的购物车实例
    cart = Cart(request)
    # 从数据库中获取指定ID的产品，如果不存在则返回404错误
    product = get_object_or_404(Product, id=product_id)
    # 从购物车中移除指定产品
    cart.remove(product)
    # 重定向到购物车详情页面
    return redirect('cart:cart_detail')


def cart_detail(request):
    # 获取当前请求的购物车实例
    cart = Cart(request)
    # 遍历购物车中的每个商品
    for item in cart:
        # 为每个商品生成一个更新数量的表单，并预填当前数量和更新标志
        item['update_quantity_form'] = CartAddProductForm(initial={'quantity': item['quantity'],
                                                                   'update': True})
    # 渲染购物车详情页面，并传递购物车数据
    return render(request, 'cart/detail.html', {'cart': cart})
